# /*
#  * EJERCICIO:
#  * Explora el concepto de manejo de excepciones según tu lenguaje.
#  * Fuerza un error en tu código, captura el error, imprime dicho error
#  * y evita que el programa se detenga de manera inesperada.
#  * Prueba a dividir "10/0" o acceder a un índice no existente
#  * de un listado para intentar provocar un error.
#  *


def Div_by_0(a,b):
    try :
        result = a/b
        
    except ZeroDivisionError as err:
        print("Error Div por 0 no permitida: ", err)
    else:
        print(f" {a} / {b} = {result}")
    
    finally:
        print("terminada la divicion")

def Array_out_of_range(lista, index ):
    try:
        a= lista[index]
    except IndexError as err:
        print("Error  : ", err)
    else:
        print(f"{a} is in {index} position")
    finally:
        print("Se acabo la jugada")


a = 2
b = 10
Div_by_0(a,b)
lista = [1,2,3,4,5]
index = 11
Array_out_of_range(lista, index)

#  * DIFICULTAD EXTRA (opcional):
#  * Crea una función que sea capaz de procesar parámetros, pero que también
#  * pueda lanzar 3 tipos diferentes de excepciones (una de ellas tiene que
#  * corresponderse con un tipo de excepción creada por nosotros de manera
#  * personalizada, y debe ser lanzada de manera manual) en caso de error.
#  * - Captura todas las excepciones desde el lugar donde llamas a la función.
#  * - Imprime el tipo de error.
#  * - Imprime si no se ha producido ningún error.
#  * - Imprime que la ejecución ha finalizado. 
#  */

class customError( Exception):
    pass

def custom_error():
    while True:
        print("Que error quieres ver :")
        print()
        print("1 - Division por Zero")
        print("2 - Index fuera de rango")
        print("3 - Personalizado ")
        print("4 - Salir")
        print()
        op = input()
        match op:
            case "1":
                 raise  ZeroDivisionError()
            case "2":
                 raise   IndexError()
            case "3":
                print("que error quieres mostrar")
                a = input()
                raise   customError(a)
            case "4":
                break
            case _:
                print("OPcion invalida...")




     

try:

    custom_error()
    
except ZeroDivisionError as e:
    print(f"**** Error 1 ***** : Division por zero")
except IndexError as e:
    print(f"**** Error 2 ***** : error de index")
except customError as e:
    print(f"**** Error 3 ***** : {e}")
except Exception as e:
    print(f"**** Error Inesperado ***** : {e}")
else:
    print("No Error ")
finally:
    print("Done...")


